// src/pages 下，所有 model.ts 文件(不区分任何字母大小写)
import { Effect, ImmerReducer, history } from 'umi'
import { loginReq } from '@/service/login'
import { message } from 'antd'
import { setCookie, getCookie } from '@/utils/cookie'
export interface ILoginState {
  loginState: boolean,
  adminname: string
  token: string
  role: string
}
export interface ILoginModel {
  namespace: 'login' // 命名空间写的和 正式定义时一致
  state: ILoginState,
  effects: {
    login: Effect
  },
  reducers: {
    // LOGIN: Reducer<ILoginState>
    // 启用 immer 之后
    LOGIN: ImmerReducer
  }
}
const loginModel: ILoginModel = {
  // 命名空间，指明模块的名称
  namespace: 'login',
  // 登录模块的初始化数据
  state: { // 刷新重置状态管理器
    loginState: getCookie('loginState') === 'true' || false,
    adminname: getCookie('adminname') || '',
    token: getCookie('token') || '',
    role: getCookie('role') || '1'
  },
  // 处理 异步操作，类似于vue的actions
  effects: {
    // 如何解决异步操作：回调函数，promise，async/await
    // effects 中使用es6的 generator 解决异步操作问题 ，需要配合 yield 解决问题
    // * ===> async    yield ===> await
    *login ({ payload }, { call, put }) {
      // payload 代表就是参数
      // call 代表调用异步操作 ------
      // put 代表触发改变reducer ----- dispatch
      const res = yield call(loginReq, payload)
      console.log(res)
      if (res.code === '10003') {
        message.error('输入信息有误')
        return
      }
      // 保存登录的状态
      setCookie('loginState', 'true')
      setCookie('adminname', res.data.adminname)
      setCookie('role', res.data.role)
      setCookie('token', res.data.token)
      // 跳转到首页
      history.push('/home')
      // 修改状态管理器的数据
      yield put({
        type: 'LOGIN',
        payload: res.data
      })
    }
  },
  // 修改状态的，类似于vue的mutations
  reducers: {
    LOGIN (state, action) {
      console.log('8888', action)
      state.adminname = action.payload.adminname
      state.role = action.payload.role
      state.token = action.payload.token
    }
  }
}
// 暴露dva的模块式，一定要 export default
export default loginModel
